#2017年国赛-程序设计题 对局匹配
from collections import Counter
n, k = map(int, input().split())
a = list(map(int, input().split()))

maxv = max(a)

#统计数字出现的次数
c = Counter(a)
if k==0:
    print(len(c))
else:
    #f[i]表示前i个积分 能获得的最大用户数
    f = [0] * (maxv+1)
    ans = 0
    for i in range(k):  # 按余数分组
        maxidx = 0  # 记录当前分组最后一个被处理的积分值（用于获取该分组的最终结果）
        #分组 {0,k,2k,...,}  {1, 1+k, 1+2k,...}
        for j in range(i,maxv+1,k):  # 遍历当前分组的所有元素
            # 存在前前项
            if j - 2*k >=0:
                # 两种选择：选当前项（取前前项值+当前值）或不选当前项（取前项值）
                f[j] = max(f[j-2*k]+c[j], f[j-k])
            # 存在前一项
            elif j-k>=0:
                f[j] = max(f[j-k], c[j])
            # 第一个元素的情况
            else:
                # 直接取当前积分的人数
                f[j] = c[j]
            maxidx = j
        ans += f[maxidx]
    print(ans)
